package com.mig.coins.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DecimalFormat;
import java.util.ArrayList;

public class CatalogoExtended extends Catalogo {
	private String nPais = null;
	private String nDivisa = null;
	private String fraccion = null;
	private String nPedido = null;
	private String nTipo = null;
	private int multiplo = 1;
	private String descrPedido = null;

	private final static String GET_SQL = "SELECT " +
	"  `catalogo`.`id`, `catalogo`.`tipo`, `catalogo`.`pedido`, `catalogo`.`observaciones`, " +
	"  `catalogo`.`pais`, `catalogo`.`ceca`, `catalogo`.`year`, " +
	"  `catalogo`.`estrella`, `catalogo`.`divisa`, `catalogo`.`facial`, `catalogo`.`orden_aux`, " +
	"  `catalogo`.`modelo`, `catalogo`.`km`, `catalogo`.`cartera`, `catalogo`.`anverso`, `catalogo`.`reverso`, " +
	"  `paises`.`pais` as nPais, `divisas`.`divisa` as nDivisa, " +
	"  `divisas`.`fraccion`, `divisas`.`multiplo`, " +
	"  `tipo_catalogo`.`tipo`, `pedidos`.`descripcion` " +
	"FROM `catalogo` LEFT JOIN `pedidos` ON `catalogo`.`pedido`= `pedidos`.`id`, " + 
	"  `paises`, `divisas`, `tipo_catalogo` " +
	"WHERE (`catalogo`.`pais` = `paises`.`id`) " +
	"  AND (`catalogo`.`divisa` = `divisas`.`id`) " +
	"  AND (`catalogo`.`tipo` = `tipo_catalogo`.`id`) ";

	public static CatalogoExtended readMonedaExtended(Connection conn, Long _id) throws SQLException {
		CatalogoExtended _moneda = new CatalogoExtended(); 
		PreparedStatement stmt=null;
		ResultSet rs = null;

		stmt=conn.prepareStatement(GET_SQL + " AND (`catalogo`.`id`=?)");
		stmt.setLong(1, _id.longValue());
		rs = stmt.executeQuery();
		if (rs.next()) 
			_moneda.loadMonedaExtendedFromResultSet(rs, 0);
		else 
			_moneda = null;

		if (rs != null) rs.close();
		if (stmt != null) stmt.close(); 

		return _moneda;
	}

	public static ArrayList<CatalogoExtended> searchMonedasExtended(Connection conn, String where, String sort) throws SQLException {
		String query = GET_SQL;
		if ((where != null) && (where.trim().length()>0)) {
			query += " AND " + where + " ";
		}
		if ((sort != null) && (sort.trim().length()>0)) {
			query +=" ORDER BY " + sort + " ";
		}
		// Creamos el Statement y el ResultSet.
		Statement stm = conn.createStatement();
		ResultSet rs = stm.executeQuery(query);

		// Procesamos el ResultSet.
		ArrayList<CatalogoExtended> lMonedas = null;
		while (rs.next()) {
			CatalogoExtended _moneda = new CatalogoExtended();
			_moneda.loadMonedaExtendedFromResultSet(rs, 0);
			if (null == lMonedas)
				lMonedas = new ArrayList<CatalogoExtended>();
			lMonedas.add(_moneda);
		}
		rs.close();
		stm.close();
		return lMonedas;
	}

	public void loadMonedaExtendedFromResultSet(ResultSet rs, int incr) throws SQLException {
		this.loadMonedaFromResultSet(rs, incr);
		
		this.nPais = rs.getString(17 + incr);
		this.nDivisa = rs.getString(18 + incr);
		this.fraccion = rs.getString(19 + incr);
		this.multiplo = rs.getInt(20 + incr);
		this.nTipo = rs.getString(21 + incr);
		this.descrPedido = rs.getString(22 + incr);
	}

	public String getNPais() {
		return nPais;
	}

	public String getNDivisa() {
		return nDivisa;
	}

	public String getFraccion() {
		return fraccion;
	}

	public int getMultiplo() {
		return multiplo;
	}

    public String getPaisCeca() {
    	String c = this.nPais;
    	if (null != this.getCeca()) 
    		c += " (" + this.getCeca() + ")";
    	return c;
    }

    public String getAnnioEmision() {
    	String year = this.getYear() + "";
    	if (null != this.getEstrella()) 
    		year += " (" + this.getEstrella() + ")";
    	return year;
    }
    
    public String getValor() {
    	String value = "";
    	/* Facial */
    	Double dValue = new Double(this.getFacial());
    	String currency = this.nDivisa;
    	if (dValue < 1.0)
    		if (null != this.fraccion) {
    			currency = this.fraccion;
    			dValue = dValue * this.multiplo;
    		}
    	
    	// Formatear dValue
		DecimalFormat df = new DecimalFormat("#,##0.## "+ currency);
    	value = df.format(dValue);

    	// Modelo
    	if (null != this.getModelo()) {
    		value += " - " + this.getModelo();
    	}
    	
    	return value;
    }

	public String getNPedido() {
		return nPedido;
	}

	public void setNPedido(String pedido) {
		nPedido = pedido;
	}

	public String getNTipo() {
		return nTipo;
	}

	public void setNTipo(String tipo) {
		nTipo = tipo;
	}
    
	public String getDescrPedido() {
		return descrPedido;
	}
    
	public void getDescrPedido(String descrPedido) {
		this.descrPedido=descrPedido;
	}
    
}
